package com.fbs.wowo.chat.service;

import com.fbs.wowo.chat.entity.Crew;
import com.fbs.wowo.chat.entity.CrewMember;
import com.fbs.wowo.chat.vo.CrewMemberVo;
import com.fbs.wowo.exception.GivenNullParamException;
import com.fbs.wowo.exception.InputVerifyFailedException;
import com.fbs.wowo.exception.NoSuchDataException;

import java.util.List;

public interface CrewService {
    /**
     * 创建群
     * @param crew 待创建的群组
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    Crew create(Crew crew) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 创建群并邀请好友入群
     * @param crew 待创建的群
     * @param uids 用户id
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    Crew create(Crew crew, String[] uids) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 邀请好友入群 忽略异常(已入群的不报错)
     * @param crewId 群组id
     * @param uids 用户id数组
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    void invite(String crewId, String[] uids) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 用户加入群
     *
     * crewId uuid id
     * @param crewId 群组id
     * @param userId 要加群的用户id
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    void join(String crewId, String userId) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 用户申请加群
     *
     * @param crewId 群组id
     * @param userId 要加群的用户id
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    Crew reply(String crewId, String userId, String content) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 用户加入的群组列表
     *
     * @param userId 用户id
     * @return 用户加入的群组列表
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    List<Crew> crewList(String userId);

    /**
     * 群成员列表
     *
     * @param crewId 群组id
     * @return 成员列表（带头像）
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    List<CrewMemberVo> crewMember(String crewId) throws GivenNullParamException, NoSuchDataException;

    /**
     * 用户退出群&被踢出群
     * 只有群主和本人有这个权利操作
     * 群主不能被踢
     * 删除时更新群人数
     *
     * @param crewId 群组id
     * @param userId 要退群的用户id
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    void remove(String crewId, String userId) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 解散群
     *
     * @param crewId 群组id
     * @param ownerId 群主id
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    void del(String crewId, String ownerId) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 查找群
     *
     * @param crewId 群组id
     * @param userId 自己id
     * @return 数据库查找到的群组数据
     */
    Crew find(String crewId, String userId);

    /**
     * 修改群信息
     *
     * @param crew 群组
     * @param ownerId 群主id
     * @throws GivenNullParamException 参数为空
     * @throws NoSuchDataException 数据库没有数据
     * @throws InputVerifyFailedException 输入数据异常
     */
    Crew modifyCrew(Crew crew, String ownerId) throws GivenNullParamException, NoSuchDataException, InputVerifyFailedException;

    /**
     * 修改群名片
     * @param crewId 用户id
     * @param userId 融云id
     */
    CrewMember modifyCrewNickname(String crewId, String userId, String nickname);

    /**
     * 热门群组
     */
    List<Crew> hotCrew();

    /**
     * 屏蔽群
     * @return 0不屏蔽 1屏蔽
     */
    Integer shield(String crewId, String userId, Byte shield);

    /**
     * 模糊查询群组
     * @param query 模糊查询字符串
     */
    List<Crew> findByQueryString(String query);
}
